﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.ДокументыСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.ДокументыСсылка
{
	///<summary>
	///(Регл)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class НачислениеОтпускаРаботникамОрганизаций:ДокументСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("825366d4-1de3-49e0-a452-3190521cc540");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928012032.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public DateTime Дата {get;set;}
		public DateTime ПрефиксНомера {get;set;}
		public string/*11*/ Номер {get;set;}
		public bool Проведен {get;set;}
		public DateTime ПериодРегистрации {get;set;}//Период регистрации
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		///<summary>
		///Любая дополнительная информация
		///</summary>
		public string/*(0)*/ Комментарий {get;set;}
		public V82.СправочникиСсылка.Пользователи Ответственный {get;set;}
		public V82.СправочникиСсылка.СотрудникиОрганизаций Сотрудник {get;set;}
		public V82.СправочникиСсылка.ФизическиеЛица Физлицо {get;set;}//Физическое лицо
		///<summary>
		///Дата начала события, оплачиваемого по среднему заработку
		///</summary>
		public DateTime ДатаНачалаСобытия {get;set;}//Дата начала события
		public DateTime ДатаНачалаОсновногоОтпуска {get;set;}//Дата начала основного отпуска
		public DateTime ДатаОкончанияОсновногоОтпуска {get;set;}//Дата окончания основного отпуска
		public decimal/*(3)*/ КоличествоДнейОсновногоОтпуска {get;set;}//Количество дней основного отпуска
		public V82.Перечисления/*Ссылка*/.ПорядокРасчетаОтпуска ПорядокРасчетаОсновногоОтпуска {get;set;}//Порядок расчета основного отпуска
		public DateTime ДатаНачалаДополнительногоОтпуска {get;set;}//Дата начала дополнительного отпуска
		public DateTime ДатаОкончанияДополнительногоОтпуска {get;set;}
		public decimal/*(3)*/ КоличествоДнейДополнительногоОтпуска {get;set;}//Дней дополнительного отпуска
		public object ВидРасчетаДополнительногоОтпуска {get;set;}//Вид расчета дополнительного отпуска
		public decimal/*(15.2)*/ УдалитьРезультатКомпенсацииОтпуска {get;set;}//Не используется
		///<summary>
		///Процент оплаты
		///</summary>
		public decimal/*(6.2)*/ ПроцентОплатыДополнительногоОтпуска {get;set;}//Процент оплаты дополнительного отпуска
		public decimal/*(15.2)*/ УдалитьСторноРезультатКомпенсацииОтпуска {get;set;}//Не используется
		public V82.Перечисления/*Ссылка*/.ПорядокРасчетаОтпуска ПорядокРасчетаКомпенсацииОтпуска {get;set;}//Порядок расчета компенсации отпуска
		public decimal/*(5.2)*/ ДнейЧасовКомпенсацииОтпуска {get;set;}//Дней часов компенсации отпуска
		public bool ИспользоватьСреднеЧасовойЗаработок {get;set;}//Использовать среднечасовой заработок
		public V82.ДокументыСсылка.ПриемНаРаботуВОрганизацию УдалитьПриказ {get;set;}//Удалить приказ
		public V82.ДокументыСсылка.НачислениеОтпускаРаботникамОрганизаций ПерерассчитываемыйДокумент {get;set;}//Перерассчитываемый документ
		public DateTime РабочийГодС {get;set;}//Рабочий год с
		public DateTime РабочийГодПо {get;set;}//Рабочий год по
		public bool ОсновнойОтпуск {get;set;}//Основной отпуск
		public bool ДополнительныйОтпуск {get;set;}//Дополнительный отпуск
		public bool КомпенсацияОтпуска {get;set;}//Компенсация отпуска
		///<summary>
		///Дата начала расчетного периода
		///</summary>
		public DateTime ПериодРасчетаСреднегоЗаработкаНачало {get;set;}//Период расчета среднего заработка начало
		///<summary>
		///Дата окончания расчетного периода
		///</summary>
		public DateTime ПериодРасчетаСреднегоЗаработкаОкончание {get;set;}//Период расчета среднего заработка окончание
		///<summary>
		///(Общ)
		///</summary>
		public string/*(40)*/ Фамилия {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		public string/*(40)*/ Имя {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		public string/*(40)*/ Отчество {get;set;}
		public V82.СправочникиСсылка.ДокументыУдостоверяющиеЛичность ВидДокумента {get;set;}//Вид документа
		public string/*(14)*/ СерияДокумента {get;set;}//Серия документа
		public string/*(14)*/ НомерДокумента {get;set;}//Номер документа
		public DateTime ДатаВыдачиДокумента {get;set;}//Дата выдачи документа
		public DateTime ДатаДействияДокумента {get;set;}//Дата действия документа
		public bool ПеречислятьПособиеПочтовымПереводом {get;set;}//Перечислять пособие почтовым переводом
		public V82.СправочникиСсылка.Банки Банк {get;set;}
		public string/*(20)*/ НомерЛицевогоСчета {get;set;}//Номер лицевого счета
		public string/*(240)*/ АдресПочтовый {get;set;}//Адрес почтовый
		public string/*(100)*/ НаименованиеБанка {get;set;}//Наименование банка
		public string/*(9)*/ БИКБанка {get;set;}//БИК банка
		public V82.СправочникиСсылка.ДолжностиОрганизаций ДолжностьУполномоченного {get;set;}//Должность уполномоченного
		public V82.СправочникиСсылка.ФизическиеЛица Уполномоченный {get;set;}
		///<summary>
		///Корреспонденский счет банка
		///</summary>
		public string/*(20)*/ КоррСчетБанка {get;set;}//Корр. счет банка
		public string/*(0)*/ КемВыданДокумент {get;set;}//Кем выдан документ
		public string/*(240)*/ АдресРегистрации {get;set;}//Адрес регистрации
		public string/*(15)*/ Телефон {get;set;}
		public string/*(30)*/ ТелефонСоставителя {get;set;}//Телефон составителя
		
		public НачислениеОтпускаРаботникамОрганизаций()
		{
		}
		
		public НачислениеОтпускаРаботникамОрганизаций(byte[] УникальныйИдентификатор)
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_Number [Номер]
					,_Fld6309 [ПериодРегистрации]
					,_Fld6310RRef [Организация]
					,_Fld6311 [Комментарий]
					,_Fld6312RRef [Ответственный]
					,_Fld21589RRef [Сотрудник]
					,_Fld6313RRef [Физлицо]
					,_Fld26847 [ДатаНачалаСобытия]
					,_Fld6315 [ДатаНачалаОсновногоОтпуска]
					,_Fld6316 [ДатаОкончанияОсновногоОтпуска]
					,_Fld21590 [КоличествоДнейОсновногоОтпуска]
					,_Fld6317RRef [ПорядокРасчетаОсновногоОтпуска]
					,_Fld6318 [ДатаНачалаДополнительногоОтпуска]
					,_Fld6319 [ДатаОкончанияДополнительногоОтпуска]
					,_Fld21591 [КоличествоДнейДополнительногоОтпуска]
					,_Fld6320RRef [ВидРасчетаДополнительногоОтпуска]
					,_Fld6324 [УдалитьРезультатКомпенсацииОтпуска]
					,_Fld6321 [ПроцентОплатыДополнительногоОтпуска]
					,_Fld6326 [УдалитьСторноРезультатКомпенсацииОтпуска]
					,_Fld6322RRef [ПорядокРасчетаКомпенсацииОтпуска]
					,_Fld6323 [ДнейЧасовКомпенсацииОтпуска]
					,_Fld18526 [ИспользоватьСреднеЧасовойЗаработок]
					,_Fld6314RRef [УдалитьПриказ]
					,_Fld6325RRef [ПерерассчитываемыйДокумент]
					,_Fld6327 [РабочийГодС]
					,_Fld6328 [РабочийГодПо]
					,_Fld26848 [ОсновнойОтпуск]
					,_Fld26849 [ДополнительныйОтпуск]
					,_Fld26850 [КомпенсацияОтпуска]
					,_Fld26851 [ПериодРасчетаСреднегоЗаработкаНачало]
					,_Fld26852 [ПериодРасчетаСреднегоЗаработкаОкончание]
					,_Fld26853 [Фамилия]
					,_Fld26854 [Имя]
					,_Fld26855 [Отчество]
					,_Fld26856RRef [ВидДокумента]
					,_Fld26857 [СерияДокумента]
					,_Fld26858 [НомерДокумента]
					,_Fld26859 [ДатаВыдачиДокумента]
					,_Fld26860 [ДатаДействияДокумента]
					,_Fld26861 [ПеречислятьПособиеПочтовымПереводом]
					,_Fld26862RRef [Банк]
					,_Fld26863 [НомерЛицевогоСчета]
					,_Fld26864 [АдресПочтовый]
					,_Fld26865 [НаименованиеБанка]
					,_Fld26866 [БИКБанка]
					,_Fld26867RRef [ДолжностьУполномоченного]
					,_Fld26868RRef [Уполномоченный]
					,_Fld26869 [КоррСчетБанка]
					,_Fld26870 [КемВыданДокумент]
					,_Fld26871 [АдресРегистрации]
					,_Fld26872 [Телефон]
					,_Fld26873 [ТелефонСоставителя]
					From _Document322(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Номер = Читалка.GetString(3);
							ПериодРегистрации = Читалка.GetDateTime(4);
							Комментарий = Читалка.GetString(6);
							ДатаНачалаСобытия = Читалка.GetDateTime(10);
							ДатаНачалаОсновногоОтпуска = Читалка.GetDateTime(11);
							ДатаОкончанияОсновногоОтпуска = Читалка.GetDateTime(12);
							КоличествоДнейОсновногоОтпуска = Читалка.GetDecimal(13);
							ПорядокРасчетаОсновногоОтпуска = V82.Перечисления/*Ссылка*/.ПорядокРасчетаОтпуска.ПустаяСсылка.Получить((byte[])Читалка.GetValue(14));
							ДатаНачалаДополнительногоОтпуска = Читалка.GetDateTime(15);
							ДатаОкончанияДополнительногоОтпуска = Читалка.GetDateTime(16);
							КоличествоДнейДополнительногоОтпуска = Читалка.GetDecimal(17);
							УдалитьРезультатКомпенсацииОтпуска = Читалка.GetDecimal(19);
							ПроцентОплатыДополнительногоОтпуска = Читалка.GetDecimal(20);
							УдалитьСторноРезультатКомпенсацииОтпуска = Читалка.GetDecimal(21);
							ПорядокРасчетаКомпенсацииОтпуска = V82.Перечисления/*Ссылка*/.ПорядокРасчетаОтпуска.ПустаяСсылка.Получить((byte[])Читалка.GetValue(22));
							ДнейЧасовКомпенсацииОтпуска = Читалка.GetDecimal(23);
							ИспользоватьСреднеЧасовойЗаработок = ((byte[])Читалка.GetValue(24))[0]==1;
							УдалитьПриказ = new V82.ДокументыСсылка.ПриемНаРаботуВОрганизацию((byte[])Читалка.GetValue(25));
							ПерерассчитываемыйДокумент = new V82.ДокументыСсылка.НачислениеОтпускаРаботникамОрганизаций((byte[])Читалка.GetValue(26));
							РабочийГодС = Читалка.GetDateTime(27);
							РабочийГодПо = Читалка.GetDateTime(28);
							ОсновнойОтпуск = ((byte[])Читалка.GetValue(29))[0]==1;
							ДополнительныйОтпуск = ((byte[])Читалка.GetValue(30))[0]==1;
							КомпенсацияОтпуска = ((byte[])Читалка.GetValue(31))[0]==1;
							ПериодРасчетаСреднегоЗаработкаНачало = Читалка.GetDateTime(32);
							ПериодРасчетаСреднегоЗаработкаОкончание = Читалка.GetDateTime(33);
							Фамилия = Читалка.GetString(34);
							Имя = Читалка.GetString(35);
							Отчество = Читалка.GetString(36);
							СерияДокумента = Читалка.GetString(38);
							НомерДокумента = Читалка.GetString(39);
							ДатаВыдачиДокумента = Читалка.GetDateTime(40);
							ДатаДействияДокумента = Читалка.GetDateTime(41);
							ПеречислятьПособиеПочтовымПереводом = ((byte[])Читалка.GetValue(42))[0]==1;
							НомерЛицевогоСчета = Читалка.GetString(44);
							АдресПочтовый = Читалка.GetString(45);
							НаименованиеБанка = Читалка.GetString(46);
							БИКБанка = Читалка.GetString(47);
							КоррСчетБанка = Читалка.GetString(50);
							КемВыданДокумент = Читалка.GetString(51);
							АдресРегистрации = Читалка.GetString(52);
							Телефон = Читалка.GetString(53);
							ТелефонСоставителя = Читалка.GetString(54);
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.ДокументыОбъект.НачислениеОтпускаРаботникамОрганизаций  ПолучитьОбъект()
		{
			var Объект = new V82.ДокументыОбъект.НачислениеОтпускаРаботникамОрганизаций();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Номер = Номер;
			Объект.ПериодРегистрации = ПериодРегистрации;
			Объект.Организация = Организация;
			Объект.Комментарий = Комментарий;
			Объект.Ответственный = Ответственный;
			Объект.Сотрудник = Сотрудник;
			Объект.Физлицо = Физлицо;
			Объект.ДатаНачалаСобытия = ДатаНачалаСобытия;
			Объект.ДатаНачалаОсновногоОтпуска = ДатаНачалаОсновногоОтпуска;
			Объект.ДатаОкончанияОсновногоОтпуска = ДатаОкончанияОсновногоОтпуска;
			Объект.КоличествоДнейОсновногоОтпуска = КоличествоДнейОсновногоОтпуска;
			Объект.ПорядокРасчетаОсновногоОтпуска = ПорядокРасчетаОсновногоОтпуска;
			Объект.ДатаНачалаДополнительногоОтпуска = ДатаНачалаДополнительногоОтпуска;
			Объект.ДатаОкончанияДополнительногоОтпуска = ДатаОкончанияДополнительногоОтпуска;
			Объект.КоличествоДнейДополнительногоОтпуска = КоличествоДнейДополнительногоОтпуска;
			Объект.ВидРасчетаДополнительногоОтпуска = ВидРасчетаДополнительногоОтпуска;
			Объект.УдалитьРезультатКомпенсацииОтпуска = УдалитьРезультатКомпенсацииОтпуска;
			Объект.ПроцентОплатыДополнительногоОтпуска = ПроцентОплатыДополнительногоОтпуска;
			Объект.УдалитьСторноРезультатКомпенсацииОтпуска = УдалитьСторноРезультатКомпенсацииОтпуска;
			Объект.ПорядокРасчетаКомпенсацииОтпуска = ПорядокРасчетаКомпенсацииОтпуска;
			Объект.ДнейЧасовКомпенсацииОтпуска = ДнейЧасовКомпенсацииОтпуска;
			Объект.ИспользоватьСреднеЧасовойЗаработок = ИспользоватьСреднеЧасовойЗаработок;
			Объект.УдалитьПриказ = УдалитьПриказ;
			Объект.ПерерассчитываемыйДокумент = ПерерассчитываемыйДокумент;
			Объект.РабочийГодС = РабочийГодС;
			Объект.РабочийГодПо = РабочийГодПо;
			Объект.ОсновнойОтпуск = ОсновнойОтпуск;
			Объект.ДополнительныйОтпуск = ДополнительныйОтпуск;
			Объект.КомпенсацияОтпуска = КомпенсацияОтпуска;
			Объект.ПериодРасчетаСреднегоЗаработкаНачало = ПериодРасчетаСреднегоЗаработкаНачало;
			Объект.ПериодРасчетаСреднегоЗаработкаОкончание = ПериодРасчетаСреднегоЗаработкаОкончание;
			Объект.Фамилия = Фамилия;
			Объект.Имя = Имя;
			Объект.Отчество = Отчество;
			Объект.ВидДокумента = ВидДокумента;
			Объект.СерияДокумента = СерияДокумента;
			Объект.НомерДокумента = НомерДокумента;
			Объект.ДатаВыдачиДокумента = ДатаВыдачиДокумента;
			Объект.ДатаДействияДокумента = ДатаДействияДокумента;
			Объект.ПеречислятьПособиеПочтовымПереводом = ПеречислятьПособиеПочтовымПереводом;
			Объект.Банк = Банк;
			Объект.НомерЛицевогоСчета = НомерЛицевогоСчета;
			Объект.АдресПочтовый = АдресПочтовый;
			Объект.НаименованиеБанка = НаименованиеБанка;
			Объект.БИКБанка = БИКБанка;
			Объект.ДолжностьУполномоченного = ДолжностьУполномоченного;
			Объект.Уполномоченный = Уполномоченный;
			Объект.КоррСчетБанка = КоррСчетБанка;
			Объект.КемВыданДокумент = КемВыданДокумент;
			Объект.АдресРегистрации = АдресРегистрации;
			Объект.Телефон = Телефон;
			Объект.ТелефонСоставителя = ТелефонСоставителя;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.ДокументыСсылка.НачислениеОтпускаРаботникамОрганизаций ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.ДокументыСсылка.НачислениеОтпускаРаботникамОрганизаций)Кэш[УИ];
			}
			var Ссылка = new V82.ДокументыСсылка.НачислениеОтпускаРаботникамОрганизаций(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}